package 代码记录.校招笔试真题.笔试真题_2023.上海金融期货信息技术苏分所;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

/**
 * @author zx
 * @create 2023-03-29 19:34
 * 大数乘法
 */
public class Test1 {
    /**
     * @return 抱歉,投机取巧了
     * 100%
     */
    public String solve (String s, String t) {
        BigInteger a = new BigInteger(s);
        BigInteger b = new BigInteger(t);
        BigInteger c = a.multiply(b);
        return c.toString();
    }

    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        // 保存计算结果
        String res = "0";

        // num2 逐位与 num1 相乘
        for (int i = num2.length() - 1; i >= 0; i--) {
            int carry = 0;
            // 保存 num2 第i位数字与 num1 相乘的结果
            StringBuilder temp = new StringBuilder();
            // 补 0
            for (int j = 0; j < num2.length() - 1 - i; j++) {
                temp.append(0);
            }
            int n2 = num2.charAt(i) - '0';

            // num2 的第 i 位数字 n2 与 num1 相乘
            for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {
                int n1 = j < 0 ? 0 : num1.charAt(j) - '0';
                int product = (n1 * n2 + carry) % 10;
                temp.append(product);
                carry = (n1 * n2 + carry) / 10;
            }
            // 将当前结果与新计算的结果求和作为新的结果
            res = addStrings(res, temp.reverse().toString());
        }
        return res;
    }

    /**
     * 对两个字符串数字进行相加，返回字符串形式的和
     * 字符串相加_415
     */
    public String addStrings(String num1, String num2) {
        int temp = 0;//进位
        StringBuilder res = new StringBuilder();
        int i = num1.length() - 1,j = num2.length() - 1;
        while(i >= 0 || j >= 0){
            int a = i >= 0 ? num1.charAt(i) - '0' : 0;
            int b = j >= 0 ? num2.charAt(j) - '0' : 0;
            int sum = a + b + temp;
            res.append(sum % 10);
            temp = sum / 10;
            i--;
            j--;
        }
        //如果最后两个数,相加的时候有进位数的时候,就将进位数添加
        if(temp > 0){
            res.append(temp);
        }
        return res.reverse().toString();
    }
}
